package at.horario.model.algo;

import java.io.Serializable;

public class Quadro implements Comparable<Quadro>, Serializable {
    public static final int PESO_GAP = 30;
    public static final int PESO_SOBREPOSICAO = 100;
    public static final int PESO_EXCESSO_AULA = 25;

    //public HashSet<Integer> oHashSet;
    public int[] colunas;

    // public HashMap<Integer, Integer> colunas;
    public int tempGaps;
    public int tempExcessoaulas;
    public int[][] matriz;
    public int valor;
    public int sobreposicao;
    public int excessoaulas;
    public int gaps;
    private int temposPorDia;

    /**
     * Constructs ...
     *
     * @param numprofessores
     * @param numhorarios
     */
    public Quadro(int numprofessores, int numhorarios, int temposPorDia) {
        matriz = new int[numprofessores][numhorarios];
        colunas = new int[numprofessores];
        this.temposPorDia = temposPorDia;

        // colunas = new HashMap<Integer, Integer>();
        //oHashSet = new HashSet<Integer>(2 * temposPorDia, 0.2f);
    }

    /**
     * Method descricao
     *
     * @param o
     * @return
     */
    public int compareTo(Quadro o) {
        return this.getValor() - o.getValor();
    }


    public void troca(int professor, int horario1, int horario2) {
        int temp = matriz[professor][horario1];

        matriz[professor][horario1] = matriz[professor][horario2];
        matriz[professor][horario2] = temp;
    }


    /**
     * Method descricao
     *
     * @return
     */
    public int[][] getMatriz() {
        return matriz;
    }

    public void setMatriz(int[][] matriz) {
        this.matriz = matriz;
    }

    /**
     * Method descricao
     *
     * @return
     */
    public int getValor() {
        return valor;
    }

    public void setValor(int valor) {
        this.valor = valor;
    }

    public int getSobreposicao() {
        return sobreposicao;
    }

    public void setSobreposicao(int sobreposicao) {
        this.sobreposicao = sobreposicao;
    }

    public int getExcessoaulas() {
        return excessoaulas;
    }

    public void setExcessoaulas(int excessoaulas) {
        this.excessoaulas = excessoaulas;
    }

    public int getGaps() {
        return gaps;
    }

    public void setGaps(int gaps) {
        this.gaps = gaps;
    }

    /**
     * Method descricao
     *
     * @return
     */
    public Quadro cloneSolucao() {
        Quadro novoQuadro = new Quadro(this.matriz.length, this.matriz[0].length, temposPorDia);


        novoQuadro.matriz = matriz.clone();

//        for (int i = 0; i < matriz.length; i++) {
//            for (int j = 0; j < matriz[0].length; j++) {
//                novoQuadro.matriz[i][j] = matriz[i][j];
//            }
//        }

        novoQuadro.excessoaulas = this.excessoaulas;
        novoQuadro.gaps = this.gaps;
        novoQuadro.sobreposicao = this.sobreposicao;
        novoQuadro.valor = this.valor;

        // novoQuadro..valor = this.valor;
        return novoQuadro;
    }


    /**
     * Method descricao
     *
     * @param vizinho
     */
    public void actualizar(Movimento vizinho) {
        troca(vizinho.professor, vizinho.horario1, vizinho.horario2);
        this.setExcessoaulas(vizinho.excessoaulas);
        this.setGaps(vizinho.gaps);
        this.setSobreposicao(vizinho.sobreposicao);
        this.setValor(vizinho.valor);
    }

    /**
     * Method descricao
     *
     * @return
     */
    public String resultados() {
        String s = "";

        s += "Avalicao:" + getValor() + "\n";
        s += "Sobreposicao:" + getSobreposicao() + "\n";
        s += "Excesso Aulas:" + getExcessoaulas() + "\n";
        s += "Gaps:" + getGaps() + "\n";

        return s;
    }


}


